home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / double.e < prev    next >
Text File  |  2000-03-25  |  8KB  |  310 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. expanded class DOUBLE
  13. --
  14. -- Note: An Eiffel DOUBLE is mapped as a C double or as a Java double.
  15. --
  16.  
  17. inherit
  18.    DOUBLE_REF
  19.       redefine
  20.          infix "+", infix "-", infix "*", infix "/", infix "^", prefix "+",
  21.          prefix "-", divisible, infix "<", infix "<=", infix ">", infix ">=",
  22.          one, zero, fill_tagged_out_memory, out_in_tagged_out_memory,
  23.          hash_code
  24.       end;
  25.    
  26. feature {ANY}
  27.  
  28.    infix "+" (other: DOUBLE): DOUBLE is
  29.       external "SmallEiffel"
  30.       end;
  31.  
  32.    infix "-" (other: DOUBLE): DOUBLE is
  33.       external "SmallEiffel"
  34.       end;
  35.  
  36.    infix "*" (other: DOUBLE): DOUBLE is
  37.       external "SmallEiffel"
  38.       end;
  39.    
  40.    infix "/" (other: DOUBLE): DOUBLE is
  41.       external "SmallEiffel"
  42.       end;
  43.  
  44.    infix "^" (e: INTEGER): DOUBLE is
  45.          -- Raise Current to `e'-th power (ANSI C pow).
  46.       external "SmallEiffel" 
  47.       end;
  48.  
  49.    prefix "+" : DOUBLE is
  50.       do
  51.          Result := Current
  52.       end;
  53.  
  54.    prefix "-": DOUBLE is
  55.       external "SmallEiffel"
  56.       end;
  57.  
  58.    abs: DOUBLE is
  59.       do
  60.          if Current < 0.0 then
  61.             Result := -Current;
  62.          else
  63.             Result := Current;
  64.          end;
  65.       end;
  66.          
  67.    infix "<" (other: DOUBLE): BOOLEAN is
  68.       external "SmallEiffel"
  69.       end;
  70.    
  71.    infix "<=" (other: DOUBLE): BOOLEAN is
  72.       external "SmallEiffel"
  73.       end;
  74.    
  75.    infix ">" (other: DOUBLE): BOOLEAN is
  76.       external "SmallEiffel"
  77.       end;
  78.    
  79.    infix ">=" (other: DOUBLE): BOOLEAN is
  80.       external "SmallEiffel"
  81.       end;
  82.    
  83.    divisible(other: DOUBLE): BOOLEAN is
  84.       do
  85.          Result := (other /= 0.0)
  86.       end;
  87.    
  88.    one: DOUBLE is 1.0;
  89.    
  90.    zero: DOUBLE is 0.0;
  91.  
  92.    double_floor: DOUBLE is
  93.          -- Greatest integral value no greater than Current.
  94.       external "SmallEiffel"
  95.       end;
  96.  
  97.    floor: INTEGER is
  98.          -- Greatest integral value no greater than Current.
  99.       local
  100.          d: DOUBLE;
  101.       do
  102.          d := double_floor;
  103.          Result := d.truncated_to_integer;
  104.       ensure 
  105.          result_no_greater: Result.to_double <= Current;
  106.          close_enough: Current - Result < one;
  107.       end;
  108.       
  109.    double_ceiling: DOUBLE is
  110.          -- Smallest integral value no smaller than Current.
  111.       do
  112.          Result := ceil;
  113.       end;
  114.  
  115.    ceiling: INTEGER is
  116.          -- Smallest integral value no smaller than Current.
  117.       local
  118.          d: DOUBLE;
  119.       do
  120.          d := double_ceiling;
  121.          Result := d.truncated_to_integer;
  122.       ensure
  123.          result_no_smaller: Current <= Result;
  124.          close_enough: Current - Result < one;
  125.       end;
  126.    
  127.    rounded: INTEGER is
  128.          -- Rounded integral value.
  129.       do
  130.          if double_floor + 0.5 < Current then
  131.             Result := double_ceiling.truncated_to_integer;
  132.          else
  133.             Result := double_floor.truncated_to_integer;
  134.          end;
  135.       end;
  136.    
  137.    truncated_to_integer: INTEGER is
  138.          -- Integer part (same sign, largest absolute value
  139.          -- no greater than Current).
  140.       external "SmallEiffel"
  141.       ensure
  142.          Result.to_double <= Current
  143.       end;
  144.    
  145.    to_real: REAL is
  146.          -- Note: C conversion from "double" to "float".
  147.          -- Thus, Result can be undefine (ANSI C).
  148.       external "SmallEiffel"
  149.       end;
  150.    
  151.    to_string: STRING is
  152.          -- Convert the DOUBLE into a new allocated STRING. 
  153.          -- As ANSI C, the default number of digit for the
  154.          -- fractionnal part is 6.
  155.          -- Note: see `append_in' to save memory.
  156.       do
  157.          !!Result.make(8);
  158.          append_in(Result);
  159.       end; 
  160.  
  161.    append_in(str: STRING) is
  162.          -- Append the equivalent of `to_string' at the end of 
  163.          -- `str'. Thus you can save memory because no other
  164.          -- STRING is allocate for the job.
  165.       require
  166.          str /= Void
  167.       do
  168.          append_in_format(str,6);
  169.       end; 
  170.    
  171.    to_string_format(f: INTEGER): STRING is
  172.          -- Convert the DOUBLE into a new allocated STRING including 
  173.          -- only `f' digits in fractionnal part. 
  174.          -- Note: see `append_in_format' to save memory.
  175.       require
  176.          f >= 0
  177.       do
  178.          sprintf_double(sprintf_double_buffer,f);
  179.          !!Result.from_external_copy(sprintf_double_buffer.to_pointer);
  180.       end; 
  181.  
  182.    append_in_format(str: STRING; f: INTEGER) is
  183.          -- Same as `append_in' but produce `f' digit of 
  184.          -- the fractionnal part.
  185.       require
  186.          str /= Void;
  187.          f >= 0
  188.       local
  189.          i: INTEGER;
  190.       do
  191.          from
  192.             sprintf_double(sprintf_double_buffer,f);
  193.             i := 0;
  194.          until
  195.             sprintf_double_buffer.item(i) = '%U'
  196.          loop
  197.             str.extend(sprintf_double_buffer.item(i));
  198.             i := i + 1;
  199.          end;
  200.       end; 
  201.    
  202. feature -- Maths functions :
  203.  
  204.    sqrt: DOUBLE is
  205.          -- Square routine (ANSI C sqrt).
  206.       require
  207.          Current >= 0;
  208.       external "SmallEiffel"
  209.       end;
  210.  
  211.    sin: DOUBLE is
  212.          -- Sinus (ANSI C sin).
  213.       external "SmallEiffel"
  214.       end;
  215.  
  216.    cos: DOUBLE is
  217.          -- Cosinus (ANSI C cos).
  218.       external "SmallEiffel"
  219.       end;
  220.  
  221.    tan: DOUBLE is
  222.          -- (ANSI C tan).
  223.       external "SmallEiffel"
  224.       end;
  225.  
  226.    asin: DOUBLE is
  227.          -- (ANSI C asin).
  228.       external "SmallEiffel"
  229.       end;
  230.  
  231.    acos: DOUBLE is
  232.          -- (ANSI C acos).
  233.       external "SmallEiffel"
  234.       end;
  235.  
  236.    atan: DOUBLE is
  237.          -- (ANSI C atan).
  238.       external "SmallEiffel"
  239.       end;
  240.  
  241.    sinh: DOUBLE is
  242.          -- (ANSI C sinh).
  243.       external "SmallEiffel"
  244.       end;
  245.  
  246.    cosh: DOUBLE is
  247.          -- (ANSI C cosh).
  248.       external "SmallEiffel"
  249.       end;
  250.  
  251.    tanh: DOUBLE is
  252.          -- (ANSI C tanh).
  253.       external "SmallEiffel"
  254.       end;
  255.  
  256.    exp: DOUBLE is
  257.          -- (ANSI C exp).
  258.       external "SmallEiffel"
  259.       end;
  260.  
  261.    log: DOUBLE is
  262.          -- (ANSI C log).
  263.       external "SmallEiffel"
  264.       end;
  265.  
  266.    log10: DOUBLE is
  267.          -- (ANSI C log10).
  268.       external "SmallEiffel"
  269.       end;
  270.  
  271. feature -- Object Printing :
  272.  
  273.    out_in_tagged_out_memory, fill_tagged_out_memory is
  274.       do
  275.          Current.append_in(tagged_out_memory);
  276.       end;
  277.  
  278. feature -- Hashing :
  279.  
  280.    hash_code: INTEGER is
  281.       do
  282.          Result := truncated_to_integer;
  283.      if Result < 0 then
  284.         Result := - (Result + 1);
  285.      end;
  286.       end;
  287.  
  288. feature {NONE}
  289.  
  290.    ceil: DOUBLE is 
  291.       external "SmallEiffel"
  292.       end;
  293.  
  294.    sprintf_double(native_array: NATIVE_ARRAY[CHARACTER]; f: INTEGER) is
  295.          -- Put in the `native_array' a viewable version of Current with
  296.          -- `f' digit of the fractionnal part. Assume the `native_array' is 
  297.          -- large enougth.
  298.       require
  299.          f >= 0
  300.       external "SmallEiffel"
  301.       end;
  302.    
  303.    sprintf_double_buffer: NATIVE_ARRAY[CHARACTER] is
  304.       once
  305.          Result := Result.calloc(1024);
  306.       end;
  307.  
  308. end -- DOUBLE
  309.  
  310.